/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package ec.edu.ucuenca.pagina_asos.uimanager;

import ec.edu.ucuenca.pagina_asos.controller.GenericController;
import ec.edu.ucuenca.pagina_asos.entity.Foro;
import ec.edu.ucuenca.pagina_asos.entity.Usuario;
import ec.edu.ucuenca.pagina_asos.uimanager.util.JsfUtil;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.Serializable;
import java.util.Date;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.imageio.ImageIO;
import javax.servlet.ServletContext;
import org.apache.commons.lang3.RandomStringUtils;
import org.primefaces.event.FileUploadEvent;

/**
 *
 * @author Johnny
 */
@ManagedBean(name = "gestorNuevaNoticias")
@ViewScoped
public class GestorNuevaNoticia implements Serializable {

    /**
     * Creates a new instance of GestorNuevaNoticia
     */
    private Foro foro;
    private String titulo;
    private int privacidad;
    private String descripcion;
    private String ext;
    private int tipo;
    private GenericController<Foro> controladorForo;
    InputStream archivo;
    private Usuario usuario;
    

    private GenericController<Foro> getControladorForo() {
        if (controladorForo == null) {
            controladorForo = new GenericController<Foro>();
        }
        return controladorForo;
    }

    public GestorNuevaNoticia() {
    }

    public Foro getForo() {
        return foro;
    }

    public void setForo(Foro foro) {
        this.foro = foro;
    }

    public String getTitulo() {
        return titulo;
    }

    public void setTitulo(String titulo) {
        this.titulo = titulo;
    }

    public int getPrivacidad() {
        return privacidad;
    }

    public void setPrivacidad(int privacidad) {
        this.privacidad = privacidad;
    }

    public String getDescripcion() {
        return descripcion;
    }

    public void setDescripcion(String descripcion) {
        this.descripcion = descripcion;
    }

    public InputStream getArchivo() {
        return archivo;
    }

    public void setArchivo(InputStream archivo) {
        this.archivo = archivo;
    }

    public int getTipo() {
        return tipo;
    }

    public void setTipo(int tipo) {
        this.tipo = tipo;
    }

    public String guardarNoticia() {
        foro = new Foro();
        foro.setNombre(titulo);
        foro.setDescripcion(descripcion);
        Date d = new Date();
        foro.setFecha(d);
        foro.setTipo(tipo);
        String nombre = d.getYear() + "" + d.getMonth() + "" + d.getDay() + d.getHours() + d.getMinutes() + d.getTime();
        foro.setPrivacidad(privacidad);
        foro.setEscuela(getUsuario().getPersona().getEscuela());
        if (getArchivo() != null) {
            foro.setImagen(nombre + RandomStringUtils.randomAlphanumeric(10) + "." + ext);
            FacesContext facesContext = FacesContext.getCurrentInstance();
            ServletContext ss = (ServletContext) facesContext.getExternalContext().getContext();
            String p = ss.getRealPath("/resources/imagenesSubidas/noticias/");
            copyFile(p, foro.getImagen(), archivo);
        }else{
            foro.setImagen("");
        }
        getControladorForo().create(foro);
        JsfUtil.addSuccessMessage("Noticia Publicada correctamente");
        return "FrmNoticias";
    }

    public void upload(FileUploadEvent event) {
        FacesMessage msg = new FacesMessage("Success! ", event.getFile().getFileName() + " is uploaded.");
        FacesContext.getCurrentInstance().addMessage(null, msg);
        // Do what you want with the file        
        try {
            setArchivo(event.getFile().getInputstream());
            ext = event.getFile().getFileName().substring(event.getFile().getFileName().length() - 3);

        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    public void copyFile(String destination, String fileName, InputStream in) {
        try {
            // write the inputStream to a FileOutputStream
            destination = destination + "/";
            OutputStream out = new FileOutputStream(new File(destination + fileName));
            int read = 0;
            byte[] bytes = new byte[1024];

            ImageIO.write(resize(in), ext, new File(destination + fileName));


            System.out.println("New file created! " + destination + fileName);
        } catch (IOException e) {
            System.out.println(e.getMessage());
        }
    }

    private BufferedImage resize(InputStream in) throws IOException {
        BufferedImage originalImage = ImageIO.read(in);
        int h = originalImage.getHeight();
        int w = originalImage.getWidth();
        int nuevoAncho = (w * 600) / h;
        int type = originalImage.getType() == 0 ? BufferedImage.TYPE_INT_ARGB : originalImage.getType();
        if (h > 600 || w > 800) {
            BufferedImage resizeImageJpg = resizeImage(originalImage, type, nuevoAncho);
            return resizeImageJpg;
        } else {
            return originalImage;
        }
    }

    private static BufferedImage resizeImage(BufferedImage originalImage, int type, int ancho) {
        BufferedImage resizedImage = new BufferedImage(ancho, 600, type);
        Graphics2D g = resizedImage.createGraphics();
        g.drawImage(originalImage, 0, 0, ancho, 600, null);
        g.dispose();

        return resizedImage;
    }

    public Usuario getUsuario() {
        if(usuario==null)
        {
            usuario=GestorUsuario.getInstance().getUsuarioActual();
        }
        return usuario;
    }

    public void setUsuario(Usuario usuario) {
        this.usuario = usuario;
    }
    
}
